{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 为什么使用测试数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(666)\n",
    "x = np.random.uniform(-3.0, 3.0, size=100)\n",
    "X = x.reshape(-1, 1)\n",
    "y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x, y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 过拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "def PolynomialRegression(degree):\n",
    "    return Pipeline([\n",
    "        (\"poly\", PolynomialFeatures(degree=degree)),\n",
    "        (\"std_scaler\", StandardScaler()),\n",
    "        (\"lin_reg\", LinearRegression())\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6879768981520811"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error\n",
    "\n",
    "poly100_reg = PolynomialRegression(degree=100)\n",
    "poly100_reg.fit(X, y)\n",
    "\n",
    "y100_predict = poly100_reg.predict(X)\n",
    "mean_squared_error(y, y100_predict) # 均方差用于衡量模型准确度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_plot = np.linspace(-3, 3, 100).reshape(100, 1)\n",
    "y_plot = poly100_reg.predict(X_plot) # 均方差虽然小了，但是模型的预测效果太差了，如下图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x, y)\n",
    "plt.plot(X_plot[:,0], y_plot, color='r')\n",
    "plt.axis([-3, 3, 0, 10])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 过拟合模型的泛化能力差，是指由此及彼的能力差，即过拟合模型对新的数据的预测效果差。为了找到合适的degree，所以引入了测试集\n",
    "+ 在训练集上表现好，同时在测试集上表现也好的模型，才是好模型\n",
    "+ 在训练集上表现好，但是在测试集上表现很差的模型，就是泛化能力差的模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### train test split的意义：确保训练出来的模型泛化能力强"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666) # 区分训练集测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.2199965269396573"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''欠拟合'''\n",
    "lin_reg = LinearRegression()\n",
    "lin_reg.fit(X_train, y_train)\n",
    "y_predict = lin_reg.predict(X_test) #\n",
    "mean_squared_error(y_test, y_predict) # 均方差太大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8035641056297901"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly2_reg = PolynomialRegression(degree=2)\n",
    "poly2_reg.fit(X_train, y_train)\n",
    "y2_predict = poly2_reg.predict(X_test)\n",
    "mean_squared_error(y_test, y2_predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9212930722150788"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly10_reg = PolynomialRegression(degree=10)\n",
    "poly10_reg.fit(X_train, y_train)\n",
    "y10_predict = poly10_reg.predict(X_test)\n",
    "mean_squared_error(y_test, y10_predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "11695751727.09301"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''过拟合，导致在测试集上预测效果极差，这就体现出了测试集的作用'''\n",
    "poly100_reg = PolynomialRegression(degree=100)\n",
    "poly100_reg.fit(X_train, y_train)\n",
    "y100_predict = poly100_reg.predict(X_test)\n",
    "mean_squared_error(y_test, y100_predict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![模型的复杂度对训练集和测试集的影响](images/模型的复杂度对训练集和测试集的影响.png)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
